<script>
	/*
	需求:手写实现一个bind方法
	面试题:call和bind之间的区别
	相同点:
			1.传入的参数个数相同
					call和bind
							第一个实参都是用来强行指定this指向
							第二个实参开始都会传递给被借调函数,作为被借调函数的实参
			2.如果传入的第一个参数不是对象数据类型,会做出对应效果
					-如果是undefined或者null
							本轮this就是window
					-如果是number,boolean,string类型的基础数据
							本轮this就是对应的包装类对象
	不同点:
			1.返回值不同
					call方法会返回被借调函数的执行结果
					bind方法会返回一个被修改了this指向的全新的函数
			2.修改this的时效性
					call方法只会临时修改被借调函数的this指向(仅限于本轮执行)
					bind方法返回的函数会被永久被修改this指向
			3.传参的次数
					call方法只能在调用call的时候传入所需的所有参数
					bind方法可以在调用bind和调用返回函数的时候传入所需要的参数(可以实现数据分批传入)
			4.函数的执行时机
					call方法会同步调用被借调函数
					bind方法不会立即执行被借调函数,需要用户二次调用返回的全新函数才能看到执行结果
	*/
	function a(x, y, z) {
		console.log(this, x, y, z);
		return x + y + z;
	}

	var obj = {
		name: "我是obj",
	};

	Function.prototype.MyBind = function (thatThis, ...args) {
		if (thatThis == null) {
			thatThis = window;
		}
		return function (...args2) {
			return a.call(thatThis, ...args, ...args2);
		};
	};
	var b = a.MyBind(obj, 1, 2);
	console.log(b(3));
</script>
